package lembrete.core.backbeans;

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import lembrete.core.beans.Entrada;
import lembrete.core.beans.Grupo;
import lembrete.core.beans.Usuario;
import lembrete.core.exceptions.ExcecaoBD;
import lembrete.core.exceptions.ExcecaoParametroInvalido;
import lembrete.core.exceptions.LembreteException;


public class EntradaHandler extends SuperHandler{
	 private Usuario user ;
	 private String nomeEntrada;
	 private String telefoneEntrada;
	 private String aniversarioString;
	 private Date aniversarioEntrada;
	 private String errorMensage = "";
	 private String[] itens;
	 private ArrayList<SelectItem> selectItens;
	 private Entrada entrada;
	 private String excluir;
	 private Grupo grupo;
	 
	 public Grupo getGrupo() throws LembreteException, ExcecaoBD {
		atualizaUsuarioSessao();
		return grupo;
	}

	public void setGrupo(Grupo grupo) {
		this.grupo = grupo;
	}

	public String getExcluir() {
		return excluir;
	}

	public void setExcluir(String excluir) {
		this.excluir = excluir;
	}

	public Entrada getEntrada() {
		return (Entrada)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("entrada");
	}

	public void setEntrada(Entrada entrada) {
		this.entrada = entrada;
	}

	public String[] getItens() {
		return itens;
	}

	public void setItens(String[] itens) {
		this.itens = itens;
	}

	public String getErrorMensage() {
		return errorMensage;
	}

	public void setErrorMensage(String errorMensage) {
		this.errorMensage = errorMensage;
	}

	public EntradaHandler() throws FileNotFoundException, ExcecaoBD{
		 super();
		 setUser((Usuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
		 this.selectItens = new ArrayList<SelectItem>();
		 setSelectItens(toSelectItem());
		 setGrupo((Grupo)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("grupo"));
	 }
	 
	 public String insereEntrada(){
			try {
				facade.insereEntrada(user.getEmail(), getNomeEntrada(), getTelefoneEntrada(), datetoString( getAniversarioEntrada() ) );
				//atualiza o usuario que esta na sessao.
				atualizaUsuarioSessao();			
				return Web_Util.OK;
			} catch (Exception e) {
				FacesContext.getCurrentInstance().addMessage("erros",new FacesMessage(e.getMessage()));
			}
			return Web_Util.FAIL;
	}
	 
	private String datetoString(Date date){
		 Date data = new java.sql.Date(date.getTime());
		 return data.toString();
	}
	 
	public void escolheEntrada(ActionEvent event) throws LembreteException, ExcecaoBD{
		UIParameter val = (UIParameter) event.getComponent().findComponent("id");
		Long id = Long.valueOf(val.getValue().toString());
		ArrayList<Entrada> entradas = getGrupo().getEntradas();
		
		for (Entrada e: entradas){
			if (e.getId().equals(id)){
				this.entrada = e;
				FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("entrada", e);
				break;
			}
		}
	}

	public void escolheEntradaGrupo(ActionEvent event){
		UIParameter val = (UIParameter) event.getComponent().findComponent("id");
		Long id = Long.valueOf(val.getValue().toString());
		ArrayList<Entrada> entradas = user.getAgenda().getListaEntradas();
		for (Entrada e: entradas){
			if (e.getId().equals(id)){
				this.entrada = e;
				FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("entrada", e);
				break;
			}
		}
	}
	
	public String editarEntrada(){
		Entrada e = (Entrada)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("entrada");
		setAniversarioString(datetoString(getAniversarioEntrada()));
		
		ArrayList<String> nomesCampos = new ArrayList<String>();
		ArrayList<String> novosValores = new ArrayList<String>();
		if (e.getNome()!= getNomeEntrada()) {
			nomesCampos.add("nome");
			novosValores.add(getNomeEntrada());
		}
		if (e.getAniversario()!= getAniversarioString()){
			nomesCampos.add("aniversario");
			novosValores.add(getAniversarioString());
		}
		if (e.getTelefone()!= getTelefoneEntrada()){
			nomesCampos.add("telefone");
			novosValores.add(getTelefoneEntrada());
		}
		
		try {
			for (int i=0; i< nomesCampos.size(); i++)
				facade.editarEntrada(user.getEmail(), String.valueOf(e.getId()), nomesCampos.get(i), novosValores.get(i));
			atualizaUsuarioSessao();
			return Web_Util.CAIXA_DE_ENTRADAS;
		} catch (Exception e2) {
			return Web_Util.FAIL;
		}
	
	}
	
	private void atualizaGrupoSessao() {
		Map sessionMap = FacesContext.getCurrentInstance().getExternalContext()
				.getSessionMap();
		Grupo grupo = (Grupo) sessionMap.get("grupo");
		Grupo grupoAtualizado = facade.getGrupoPorId(grupo.getIdGrupo());
		sessionMap.remove("grupo");
		sessionMap.put("grupo", grupoAtualizado);
	}
	
	public void update(ActionEvent event){
		atualizaGrupoSessao();
	}

	public String editarEntradaGrupo(){
		Entrada e = (Entrada)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("entrada");
		setAniversarioString(datetoString(getAniversarioEntrada()));
		
		ArrayList<String> nomesCampos = new ArrayList<String>();
		ArrayList<String> novosValores = new ArrayList<String>();
		if (e.getNome()!= getNomeEntrada()) {
			nomesCampos.add("nome");
			novosValores.add(getNomeEntrada());
		}
		if (e.getAniversario()!= getAniversarioString()){
			nomesCampos.add("aniversario");
			novosValores.add(getAniversarioString());
		}
		if (e.getTelefone()!= getTelefoneEntrada()){
			nomesCampos.add("telefone");
			novosValores.add(getTelefoneEntrada());
		}
		try {
			for (int i=0; i< nomesCampos.size(); i++)
				facade.editarEntrada(user.getEmail(), String.valueOf(getGrupo().getIdGrupo()), String.valueOf(e.getId()), nomesCampos.get(i), novosValores.get(i));
			atualizaUsuarioSessao();
			atualizaGrupoSessao();
			return Web_Util.OK;
		} catch (Exception e2) {
			return Web_Util.FAIL;
		}
		
	}
	
	private void atualizaUsuarioSessao() throws LembreteException, ExcecaoBD {
		String login = user.getEmail();
		String password = user.getPassword();
		Map sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();  
		sessionMap.remove("user");
		sessionMap.put("user", facade.fazLogin(login, password));	
	}

	public String excluiEntrada() throws FileNotFoundException, ExcecaoBD, ExcecaoParametroInvalido, LembreteException{
		setEntrada(getEntrada());
		if (excluir.equals("true")){
			facade.excluirEntrada(user.getEmail(), String.valueOf(entrada.getId()));
			atualizaUsuarioSessao();
			return Web_Util.OK;
		}
		else return Web_Util.ABORT;
	}
	
	public String excluiEntradaGrupo() throws FileNotFoundException, ExcecaoBD, ExcecaoParametroInvalido, LembreteException{
		setEntrada(getEntrada());
		if (excluir.equals("true")){
			facade.excluirEntrada(user.getEmail(), String.valueOf(getGrupo().getIdGrupo()), String.valueOf(entrada.getId()));
			atualizaUsuarioSessao();
			return Web_Util.OK;
		}
		else return Web_Util.ABORT;
	}
	
	public String adicionarEntradaGrupo(){
		try {
			for (String entrada : itens){
				Long id = facade.localizaEntrada(user.getEmail(),entrada);
				facade.adicionarEntradaGrupo(user.getEmail(), String.valueOf(getGrupo().getIdGrupo()), String.valueOf(id));
			}
			atualizaUsuarioSessao();
			return Web_Util.OK;
		} catch (Exception e) {
			return Web_Util.FAIL;
		}	
	}
	
	public Usuario getUser() {
		return user;
	}

	public void setUser(Usuario user) {
		this.user = user;
	}

	public ArrayList<SelectItem> toSelectItem(){
		ArrayList<Entrada> entradas = this.user.getAgenda().getListaEntradas();	
		ArrayList<SelectItem> selectItems = new ArrayList<SelectItem>();
		for(int i=0;i<entradas.size();i++){
			selectItems.add(new SelectItem(entradas.get(i).toString()));
		}
		return selectItems;
	}
	
	public String getNomeEntrada() {
		return nomeEntrada;
	}

	public void setNomeEntrada(String nomeEntrada) {
		this.nomeEntrada = nomeEntrada;
	}

	public String getTelefoneEntrada() {
		return telefoneEntrada;
	}

	public void setTelefoneEntrada(String telefoneEntrada) {
		this.telefoneEntrada = telefoneEntrada;
	}

	public Date getAniversarioEntrada() {
		return aniversarioEntrada;
	}

	public void setAniversarioEntrada(Date aniversarioEntrada) {
		this.aniversarioEntrada = aniversarioEntrada;
	}

	public ArrayList<SelectItem> getSelectItens() {
		return selectItens;
	}

	public void setSelectItens(ArrayList<SelectItem> selectItens) {
		this.selectItens = selectItens;
	}

	public String getAniversarioString() {
		return aniversarioString;
	}

	public void setAniversarioString(String aniversarioString) {
		this.aniversarioString = aniversarioString;
	}
}
